<?php

namespace App\Http\Traits;

trait CheckPermission
{
    /**
     * 检查权限
     *
     * @param string $permissionCode 权限编码
     * @return bool
     */
    protected function checkPermission(string $permissionCode): bool
    {
        $user = auth()->user();
        
        if (!$user) {
            return false;
        }

        return $user->hasPermission($permissionCode);
    }

    /**
     * 检查按钮权限
     *
     * @param string $resource 资源标识
     * @param string $action 操作类型
     * @return bool
     */
    protected function checkButtonPermission(string $resource, string $action): bool
    {
        $user = auth()->user();
        
        if (!$user) {
            return false;
        }

        return $user->hasButtonPermission($resource, $action);
    }

    /**
     * 检查数据权限
     *
     * @param string $resource 资源标识
     * @param string $action 操作类型
     * @param mixed $dataId 数据ID（可选）
     * @return bool
     */
    protected function checkDataPermission(string $resource, string $action, $dataId = null): bool
    {
        $user = auth()->user();
        
        if (!$user) {
            return false;
        }

        return $user->hasDataPermission($resource, $action, $dataId);
    }

    /**
     * 授权检查（如果没有权限则返回错误）
     *
     * @param string $permissionCode 权限编码
     * @return void
     * @throws \Illuminate\Http\Exceptions\HttpResponseException
     */
    protected function authorizePermission(string $permissionCode): void
    {
        if (!$this->checkPermission($permissionCode)) {
            abort(403, '无权限访问');
        }
    }

    /**
     * 授权检查按钮权限
     *
     * @param string $resource 资源标识
     * @param string $action 操作类型
     * @return void
     * @throws \Illuminate\Http\Exceptions\HttpResponseException
     */
    protected function authorizeButtonPermission(string $resource, string $action): void
    {
        if (!$this->checkButtonPermission($resource, $action)) {
            abort(403, '无权限执行此操作');
        }
    }

    /**
     * 授权检查数据权限
     *
     * @param string $resource 资源标识
     * @param string $action 操作类型
     * @param mixed $dataId 数据ID（可选）
     * @return void
     * @throws \Illuminate\Http\Exceptions\HttpResponseException
     */
    protected function authorizeDataPermission(string $resource, string $action, $dataId = null): void
    {
        if (!$this->checkDataPermission($resource, $action, $dataId)) {
            abort(403, '无权限操作此数据');
        }
    }
}

